import { get, deleteAjax, post } from '../../api/ajax'
import WPopView from '../../utils/popView'
import { w_remove_pop } from '../../utils/myPlugin'
import WBaseModel from '../BaseModel'

/**
 * 模型基础类，必须继承才能使用
 */
class WebBaseModel extends WBaseModel{

  /**
   * 构造方法
   */
  constructor() {
    super()
    /**
     * ID
     */
    this._id = null
    /**
     * 获取详情数据的URL
     * @type {String}
     */
    this.detailUrl = null
    /**
     * 删除数据的URL
     * @type {String}
     */
    this.removeUrl = null
    /**
     * 添加数据的URL
     * @type {String}
     */
    this.addUrl = null
    /**
     * 更新数据的URL
     * @type {String}
     */
    this.updateUrl = null
    /**
     * 添到回收站的URL
     * @type {String}
     */
    this.dustbinPushUrl = null
    /**
     * 回收站还原的URL
     * @type {String}
     */
    this.dustbinPopUrl = null
    /**
     * 添加修改数据的KEY数组
     * @type {Array}
     */
    this.addOrUpdateKeyArr = null
  }

  /**
   * 分页加载数据
   * @param page 请求页
   * @param otherData 请求参数
   * @returns {Promise<any>}
   */
  static loadModels(page, otherData = {}) {
    return new Promise((resolve, reject) => {
      get(this.listUrl, {
        page,
        ...otherData
      }).then((data) => {
        resolve(this.getModelsWithArr(data))
      }).catch((err) => {
        reject(err)
      })
    })
  }

  /**
   * 加载列表数据(直接加载所有，无分页)
   * @returns {Promise<any>}
   */
  static loadAllModels(url, cache) {
    return new Promise((resolve, reject) => {
      get(url ? url : this.listUrl, {}, cache).then((dataArr) => {
        resolve(this.getModelsWithArr(dataArr))
      }).catch((err) => {
        reject(err)
      })
    })
  }

  /**
   * 获取详情数据
   */
  getDetail() {
    return new Promise((resolve, reject) => {
      get(this.detailUrl, {
        id: this._id
      }).then((data) => {
        this.setDataWithJson(data)
        resolve(this)
      }).catch((err) => {
        reject(err)
      })
    })
  }

  /**
   * 删除对象
   * @param key 删除提示的字段
   * @returns {Promise<any>}s
   */
  remove(key, otherData = {}) {
    const tip = key ? `"${this[key]}"` : ''
    return w_remove_pop(() => {
      return deleteAjax(this.removeUrl, {
        id: this._id,
        ...otherData
      })
    }, tip)
  }

  /**
   * 将数据添加到回收站
   * @param key 显示的标题键值
   * @param otherData 给后台传送的其他数据
   * @returns {Promise<*>}
   */
  dustbin_push(key, otherData = {}) {
    const tip = key ? `"${this[key]}"` : null
    return w_remove_pop(() => {
      return get(this.dustbinPushUrl, {
        id: this._id,
        ...otherData
      })
    }, tip, true)
  }

  /**
   * 还原数据
   * @returns {Promise<*>}
   */
  dustbin_pop() {
    return new Promise((resolve, reject) => {
      get(this.dustbinPopUrl, {
        id: this._id
      }).then(() => {
        WPopView.msgSuccess('撤销成功')
        resolve()
      }).catch(() => {
        reject()
      })
    })
  }

  /**
   * 获取所有回收站数据
   */
  static dustbin_all() {
    return new Promise((resolve, reject) => {
      get(this.dustbinAllUrl).then((dataArr) => {
        resolve(this.getModelsWithArr(dataArr))
      }).catch((err) => {
        reject(err)
      })
    })
  }

  /**
   * 添加或者修改banner
   * @param isEdd 是否添加
   * @returns {Promise<any>}
   */
  addOrUpdate() {
    const otherP = {}
    this._id ? otherP.id = this._id : null
    return new Promise((resolve, reject) => {
      const p = this.addOrUpdateKeyArr ? this.getJson(this.addOrUpdateKeyArr, otherP) : this
      post(this._id ? this.updateUrl : this.addUrl, p).then((data) => {
        WPopView.msgSuccess(this._id ? '修改成功' : '添加成功', {
          onClose() {
            resolve()
          }
        })
        this._id ? null : this._id = data._id
      }).catch((err) => {
        reject(err)
      })
    })
  }

  /**
   * 获取所有不同类型数组
   * @returns {Promise}
   */
  static loadTypes() {
    return get(this.typesUrl)
  }

  /**
   * 根据键值获取指定对象
   * @param keys 键值数组
   * @param json 默认数据
   * @returns { Object }
   */
  getJson(keys, json = {}) {
    const jsonData = {}
    if (keys instanceof Array) {
      keys.forEach((key) => {
        if (typeof key === 'string') {
          jsonData[key] = this[key]
        }
      })
    }
    // json 是默认数据需要最后赋值
    Object.assign(jsonData, json)
    return jsonData
  }

  // 获取json对象
  /**
   * 根据键值获取指定对象
   * @param obj 获取的对象
   * @param keys 键值数组
   * @param json 默认数据
   * @returns { Object }
   */
  static getJson(obj, keys, json = {}) {
    return obj.getJson(keys, json)
  }
}

/**
 * 列表加载URL
 * @type {String}
 */
WebBaseModel.listUrl = null
/**
 * 不同类型的URL
 * @type {String}
 */
WebBaseModel.typesUrl = null
/**
 * 获取所有回收站数据
 * @type {String}
 */
WebBaseModel.dustbinAllUrl = null

export default WebBaseModel
